\ =========================================================================================
\ by joevt Dec 25, 2022
\
\ To Do: Handle Type 2 header which only has one BAR


0 value pcirepeat
3 value vcirepeat		\ 4 seems to work good for vci0 (better than 5 or most odd numbers greater than 5)
0 value therepeat
0 value pcilast

\ : .stack { ; sdepth }
\ 	depth -> sdepth sdepth 0< if 
\ 		" UNDERFLOW! " type sdepth . 
\ 	else 
\ 		sdepth 0= if 
\ 			" Empty" type 
\ 		else 
\ 			sdepth 8 > if ." ...{ " sdepth 8 - .d ." } " then
\ 			0 sdepth 1- 8 min do
\ 				i pick u.
\ 				-1 +loop 
\ 			then 
\ 		then 
\ 	cr ;

: chc " config-l@" $find if drop else cr ." select a pci device" abort then ;
: $ex $find if execute else 2drop then ;
: cl! " config-l!" $ex ;
: cl@ " config-l@" $ex ;
: cw@ " config-w@" $ex ;
: cb@ " config-b@" $ex ;

: pc@ { adr } ( addr -- data )
	adr cl@ dup to pcilast
	therepeat 0 ?do to pcilast adr cl@ loop ;

: pciconfig ( bus dev fun -- adr )
8 << swap b << rot 10 << + + ;

: dumpbar { adr ; blo bhi } ( baradr )
	adr pc@ -> blo
	blo if
		25 spaces
		adr 8 u.r ." :"
		blo 7 and 4 = if
			adr 4+ pc@ -> bhi
			bhi 8 u.r
		then
		blo 8 u.r ." ."
		blo 7 and 4 = if
			-1 adr 4+ cl!
			adr 4+ pc@
			bhi adr 4+ cl!
			8 u.r
		then
		-1 adr cl!
		adr pc@
		blo adr cl!
		8 u.r
		cr
	then
;

: .configl ['] pc@ catch if drop ." ........" else lbflip 8 u.r then 4 ;
: .configw ['] cw@ catch if drop ." ...." else wbflip 4 u.r then 2 ;
: .configb ['] cb@ catch if drop ." .." else 2 u.r then 1 ;
defer .config
' .configl to .config
\ ' .configw to .config
\ ' .configb to .config

: lspcidump { bus dev fun ; adr }
\	cr ." depth and stack:" depth . ." : " .stack
	bus 2 u.r ." :" dev 2 u.r ." ." fun 1 u.r
	bus dev fun pciconfig -> adr
	adr c + pc@ dup 									\ {headertype} {headertype}
\	cr ." headertype,headertype:" .stack
	800000 and 0=										\ {headertype} {notmultifunction}
\	." ismultifunction:" .stack
	fun 0= and											\ {headertype} {func0 and notmultifunction}
\	." func0 and notmultifunction:" .stack
	if 8 else 1 then									\ {headertype} {nextfunc}
\	." funcstep:" .stack
	swap												\ {nextfunc} {headertype}
	7f0000 and											\ {nextfunc} {headertypeIsNot0}
\	." headertypeisnot0:" .stack cr
	if													\ {nextfunc}
		38 14 10 3										\ {nextfunc} BARs #BARs
		." -[" adr 18 + pc@ dup							\ {nextfunc} BARs #BARs {buses} {buses}
		10 >> ff and									\ {nextfunc} BARs #BARs {buses} {subordinatebus}
		swap 8 >> ff and								\ {nextfunc} BARs #BARs {subordinatebus} {secondarybus}
		2dup 2 u.r										\ {nextfunc} BARs #BARs {subordinatebus} {secondarybus} {subordinatebus}
		<> if											\ {nextfunc} BARs #BARs {subordinatebus}
			." -" 2 u.r									\ {nextfunc} BARs #BARs
			1											\ {nextfunc} BARs #BARs 1space
		else											\ {nextfunc} BARs #BARs {subordinatebus}
			drop										\ {nextfunc} BARs #BARs
			4											\ {nextfunc} BARs #BARs 4space
		then											\ {nextfunc} BARs #BARs 4or1
		." ]"											\ {nextfunc} BARs #BARs 4or1
	else												\ {nextfunc}
		30 24 20 1c 18 14 10 7							\ {nextfunc} BARs #BARs
		9												\ {nextfunc} BARs #BARs 9space
	then												\ {nextfunc} BARs #BARs 9or4or1space
	spaces ." [" 										\ {nextfunc} BARs #BARs
	adr pc@ dup											\ {nextfunc} BARs #BARs {vendordevice} {vendordevice}
	4 u.r ." :"											\ {nextfunc} BARs #BARs {vendordevice}
	10 >> 4 u.r ." ] ["									\ {nextfunc} BARs #BARs
	adr 8 + pc@ 8 >>									\ {nextfunc} BARs #BARs {classrev}
	6 u.r ." ] "										\ {nextfunc} BARs #BARs
	\ all three of these should produce the same result
	100 0 do adr i + .config +loop cr
\	." dobars:" .stack
	0													\ {nextfunc} lastBAR ... firstBAR #BARs 0
	do													\ {nextfunc} lastBAR ... firstBAR
		adr + 											\ {nextfunc} lastBAR ... firstBAR+adr
		dumpbar											\ {nextfunc} lastBAR ...
	loop												\ {nextfunc}
\	." lspcidump:" .stack
;


: lspcifun { bus dev fun ; adr }
	chc
	bus dev fun pciconfig -> adr
	adr ['] pc@
	catch if
																\ errorcode
\		." catch:" .stack
		drop 0													\ isgood=false
	else
		pcilast													\ {vendordeviceid#n} {vendordeviceid#m}
		over													\ {vendordeviceid#n} {vendordeviceid#m} {vendordeviceid#n}
		=														\ {vendordeviceid#n} {vendordeviceid#m}=={vendordeviceid#n}
		swap													\ {vendordeviceid#m}=={vendordeviceid#n} {vendordeviceid#n}
		-1 <>													\ {vendordeviceid#m}=={vendordeviceid#n} {vendordeviceid#n}!=-1
		and														\ {vendordeviceid#m}=={vendordeviceid#n}&&{vendordeviceid#n}!=-1
\		." isgood:" .stack
	then
	if
\		." dogood:" .stack
		bus dev fun lspcidump									\ nextfunc=lspcidump
	else
\		." dobad:" .stack
		1 fun 0=												\ nextfunc=1 fun==0
		if
			drop 8												\ nextfunc=8
		then
	then
\	exit? if abort then
;

: lspcidev ( bus dev ) 8 0 do 2dup i lspcifun +loop 2drop ;
: lspcibus ( bus ) 20 0 do dup i lspcidev loop drop ;
: lspci pcirepeat to therepeat cr 100 0 do i lspcibus loop ;
: lsvci vcirepeat to therepeat cr 100 0 do i lspcibus loop ;

: setpci { bus dev fun reg ; adr }
	chc bus dev fun pciconfig reg + -> adr
	bus 2 u.r ." :" dev 2 u.r ." ." fun 1 u.r ."  = " adr 8 u.r adr cl@ ."  -> " 8 u.r
;


\=========================================================================================

dev pci1




0 > dev / ls 
FF828F80: /PowerPC,601@0
FF829878: /chosen@0
FF8299A8: /memory@0
FF829AF0: /openprom@0
FF829BB0: /AAPL,ROM@FFC00000
FF829DC8: /options@0
FF82A268: /aliases@0
FF82A4A8: /packages@0
FF82A530:   /deblocker@0,0
FF82AD30:   /disk-label@0,0
FF82B270:   /obp-tftp@0,0
FF82D6B0:   /mac-files@0,0
FF82DEA8:   /mac-parts@0,0
FF82E608:   /aix-boot@0,0
FF82EA80:   /fat-files@0,0
FF830050:   /iso-9660-files@0,0
FF830998:   /xcoff-loader@0,0
FF831358:   /terminal-emulator@0,0
FF8313F0: /bandit@F2000000
FF8325E0:   /gc@10
FF832A18:     /53c94@10000
FF8342A0:       /sd@0,0
FF834ED0:       /st@0,0
FF835B48:     /mace@11000
FF8369C0:     /escc@13000
FF836B18:       /ch-a@13020
FF8371C8:       /ch-b@13000
FF837878:     /awacs@14000
FF837960:     /swim3@15000
FF838A68:     /via-cuda@16000
FF8395F8:       /adb@0,0
FF8396E8:         /keyboard@0,0
FF839E38:         /mouse@1,0
FF839EE8:       /pram@0,0
FF839F98:       /rtc@0,0
FF83A460:       /power-mgt@0,0
FF83A580:     /mesh@18000
FF83C0E8:       /sd@0,0
FF83CD18:       /st@0,0
FF83DA20:     /sixty6@1C000
FF83DB48:     /nvram@1D000
FF840598:   /pci106b,1@B
FF863A30:   /pci-bridge@F
FF864698:     /pci16b8,12@0
FF864908:     /pci16b8,12@0,1
FF864B78:     /pci16b8,21@0,2
FF864DE8:     /pci16b8,1@1
FF865080:     /Ultra-Tek133P@2
FF88F208:       /sd@0,0
FF83DC80: /chaos@F0000000
FF8A3B98:   /control@B
FF8A4F50:   /planb@D
FF83EBA8: /bandit@F4000000
FF83FE00: /hammerhead@F8000000

==========================================================================================

0 > devalias 
vci0                /chaos@F0000000
pci1                /bandit@F2000000
pci2                /bandit@F4000000
fd                  /bandit/gc/swim3
kbd                 /bandit/gc/via-cuda/adb/keyboard
ttya                /bandit/gc/escc/ch-a
ttyb                /bandit/gc/escc/ch-b
enet                /bandit/gc/mace
scsi                /bandit/gc/53c94
scsi-int            /bandit/gc/mesh
 ok


0 > printenv 
little-endian?      false               false
real-mode?          false               false
auto-boot?          true                true
diag-switch?        false               false
fcode-debug?        false               false
oem-banner?         false               false
oem-logo?           false               false
use-nvramrc?        false               false
real-base           -1                  -1 
real-size           100000              100000 
virt-base           -1                  -1 
virt-size           100000              100000 
load-base           4000                4000 
pci-probe-list      -1                  -1 
screen-#columns     64                  64 
screen-#rows        28                  28 
selftest-#megs      0                   0 
boot-device         /AAPL,ROM           /AAPL,ROM
boot-file                               
diag-device         fd:diags            fd:diags
diag-file                               
input-device        ttya                ttya
output-device       ttya                ttya
oem-banner                              
oem-logo                                
nvramrc                                 
boot-command        boot                boot
 ok

0 > dev pci1  ok
0 > lspci 
00:0B.0         [106B:0001] [060000] 6B10010016008022030000060820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040080000000000000C000001000000000700000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00:0D.0         [1002:5159] [030000] 021059518400900200000003082000000800000001040000000000000000000000000000000000000000000002100809000000005000000000000000FF010800000000000000000000000000021008090100020600000000025020000002002F00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00:0F.0-[01]    [1668:0100] [060400] 6816000107009002110004060820010000000000000000000001010010108022008800880088F0870000000000000000000000008000000000000000FF00040001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000019002F60000C000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00:10.0         [106B:0002] [FF0000] 6B10020016000082020000FF08200000000000F30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01:00.0         [1033:0035] [0C0310] 33103500140010024110030C0820800000200288000000000000000000000000000000000000000000000000B81612000000000040000000000000000001012A0100027E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053330C400000000000000000000000000000000000000000000000000000000
01:00.1         [1033:0035] [0C0310] 33103500140010024110030C0820000000100288000000000000000000000000000000000000000000000000B81612000000000040000000000000000002012A0100027E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01:00.2         [1033:00E0] [0C0320] 3310E000140010020220030C0820000000300288000000000000000000000000000000000000000000000000B8162100000000004000000000000000000310220100027E0000000000000000000000000000000000000000000000000000000020203F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053330C400000000000000000000000000000000000000000000000000000000
01:01.0         [11C1:5811] [0C0010] C1111158140090020410000C0820000000000288000000000000000000000000000000000000000000000000B816010000000000440000000000000000010000000000000100027E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019330003E420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
01:02.0         [105A:4D69] [018085] 5A10694D040030040285800108200000411000003110000021100000111000000110000000000188000000005A1069AD0000008860000000000000000E010412000000000000000000000000000000000000000000000000000000000000000001002102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 ok

0 > dev vci0  ok
0 > lspci 
02:03.0         [0000:0000] [000000] FFFFFFFFFFFFFFFFFFFFFFFF0C000000FFFFFFFF0000000000000000180000001C000000FFFFFFFFFFFFFFFF2C000000FFFFFFFF0000000000000000380000003C000000FFFFFFFFFFFFFFFF4C000000FFFFFFFF0000000000000000580000005C000000FFFFFFFFFFFFFFFF6C000000FFFFFFFF0000000000000000780000007C000000FFFFFFFFFFFFFFFF8C000000FFFFFFFF0000000000000000980000009C000000FFFFFFFFFFFFFFFFAC000000FFFFFFFF0000000000000000B8000000BC000000FFFFFFFFFFFFFFFFCC000000FFFFFFFF0000000000000000D8000000DC000000FFFFFFFFFFFFFFFFEC000000FFFFFFFF0000000000000000F8000000
02:04.0-[FF]    [00FC:0000] [000000] 1000000014000000FFFFFFFF00000000000000001000000014000000FFFFFFFFFFFFFFFF34000000FFFFFFFF00000000000000003000000034000000FFFFFFFFFFFFFFFF54000000FFFFFFFF00000000000000005000000054000000FFFFFFFFFFFFFFFF74000000FFFFFFFF00000000000000007000000074000000FFFFFFFFFFFFFFFF94000000FFFFFFFF00000000000000009000000094000000FFFFFFFFFFFFFFFFB4000000FFFFFFFF0000000000000000B0000000B4000000FFFFFFFFFFFFFFFFD4000000FFFFFFFF0000000000000000D0000000D4000000FFFFFFFFFFFFFFFFF4000000FFFFFFFF0000000000000000F0000000F4000000FFFFFFFF
02:04.2         [0210:0000] [FFFFFF] FFFFFFFF0000000000000000180200001C020000FFFFFFFFFFFFFFFF1C020000FFFFFFFF0000000000000000380200003C020000FFFFFFFFFFFFFFFF3C020000FFFFFFFF0000000000000000580200005C020000FFFFFFFFFFFFFFFF5C020000FFFFFFFF0000000000000000780200007C020000FFFFFFFFFFFFFFFF7C020000FFFFFFFF0000000000000000980200009C020000FFFFFFFFFFFFFFFF9C020000FFFFFFFF0000000000000000B8020000BC020000FFFFFFFFFFFFFFFFBC020000FFFFFFFF0000000000000000D8020000DC020000FFFFFFFFFFFFFFFFDC020000FFFFFFFF0000000000000000F8020000FC020000FFFFFFFFFFFFFFFFFC020000
02:0B.0         [106B:0003] [000000] 6B10030000000000000000000000000003000084000000A4000000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
02:0D.0         [106B:0004] [FF0000] 6B10040014000002010000FF08200000001000A40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 ok




0 > dev pci1  ok
0 > lspci 
00:0B.0         [106B:0001] [060000] 6B10010016008022030000060820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040080000000000000C000001000000000700000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00:0D.0         [1002:5159] [030000] 021059518400900200000003082000000800000001040000000000000000000000000000000000000000000002100809000000005000000000000000FF010800000000000000000000000000021008090100020600000000025020000002002F00020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                                     00006810:00000008.F8000008
                                     00006814:00000401.FFFFFF01
00:0F.0-[01]    [1668:0100] [060400] 6816000107009002110004060820010000000000000000000001010010108022008800880088F0870000000000000000000000008000000000000000FF00040001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000019002F60000C000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00:10.0         [106B:0002] [FF0000] 6B10020016000082020000FF08200000000000F30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                                     00008010:F3000000.FFFE0000
01:00.0         [1033:0035] [0C0310] 33103500140010024110030C0820800000200288000000000000000000000000000000000000000000000000B81612000000000040000000000000000001012A0100027E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053330C400000000000000000000000000000000000000000000000000000000
                                     00010010:88022000.FFFFF000
01:00.1         [1033:0035] [0C0310] 33103500140010024110030C0820000000100288000000000000000000000000000000000000000000000000B81612000000000040000000000000000002012A0100027E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                                     00010110:88021000.FFFFF000
01:00.2         [1033:00E0] [0C0320] 3310E000140010020220030C0820000000300288000000000000000000000000000000000000000000000000B8162100000000004000000000000000000310220100027E0000000000000000000000000000000000000000000000000000000020203F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053330C400000000000000000000000000000000000000000000000000000000
                                     00010210:88023000.FFFFFF00
01:01.0         [11C1:5811] [0C0010] C1111158140090020410000C0820000000000288000000000000000000000000000000000000000000000000B816010000000000440000000000000000010000000000000100027E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019330003E420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                                     00010810:88020000.FFFFF000
01:02.0         [105A:4D69] [018085] 5A10694D040030040285800108200000411000003110000021100000111000000110000000000188000000005A1069AD0000008860000000000000000E010412000000000000000000000000000000000000000000000000000000000000000001002102000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
                                     00011010:00001041.FFFFFFF9
                                     00011014:00001031.FFFFFFFD
                                     00011018:00001021.FFFFFFF9
                                     0001101C:00001011.FFFFFFFD
                                     00011020:00001001.FFFFFFF1
                                     00011024:88010000.FFFF0000
                                     00011030:88000000.FFFF0001
 ok

